package JVM.第06篇_垃圾回收篇;

/**
 *
 *  1.复制算法（Copying）//先标记不清除的，将标记的复制到一个新的位置，将之前此区域清空
 *       //常用算法   是年轻代用的垃圾回收算法    优点：不会产生内存碎片    缺点：费空间
 *
 *  2.标记清除（Mark-Sweep）//先标记不清除的，将标记数据保留。
 *       //用在老年代    优点：节约空间    缺点：产生内存碎片  扫描2次  耗时长
 *
 *  3.标记压缩（标记整理）（Mark-Compact）//标记清除后，在整理
 *            //  老年代（多次清除时在压缩）  缺点：耗时最长（标记清除+整理）
 *
 *          优点: (此算法消除了“标记清除”和“复制”两个算法的弊端。)
 *              ●消除了标记/清除算法当中，内存区域分散的缺点，我们需要给新对象分配内存时，
 *              JVM只需要持有一个内存的起始地址即可。
 *              ●消除了复制算法当中，内存减半的高额代价。
 *          缺点:
 *          ●从效率上来说，标记-压缩算法要低于复制算法。
 *              ●效率不高，不仅要标记所有存活对象，还要整理所有存活对象的引用地址。
 *              ●对于老年代每次都有大量对象存活的区域来说，极为负重。
 *          ●移动对象的同时，如果对象被其他对象引用，则还需要调整引用的地址。
 *          ●移动过程中，需要全程暂停用户应用程序。即: STW
 *
 *
 *  4.分代收集算法:如JAVA 年轻代-复制算法    老年代-标记压缩
 *      分代收集算法，是基于这样一个事实:
 *          不同的对象的生命周期是不一样的。
 *          因此，不同生命周期的对象可以采取不同的收集方式，以便提高回收效率。
 *          一般是把Java堆分为新生代和老年代，这样就可以根据各个年代的特点使用不同的回收算法，
 *          以提高垃圾回收的效率。
 *          在Java程序运行的过程中，会产生大量的对象，其中有些对象是与业务信息相关，
 *          比如Http请求中的sessicn对象、线程、Socket连接，这类对象跟业务直接挂钩，因此生命周期比较长。
 *          但是还有一些对象，主要是程序运行过程中生成的临时变量，这些对象生命周期会比较短，
 *          比如: string对象，中于其不变类的特性，系统会产生大量的这些对象，
 *          有些对象甚至只用一次即可回收。
 *
 * 目前几乎所有的GC都是采用分代收集(Generational Collecting) 算法执行垃圾回收的。
 * 在HotSpot中，基于分代的概念，GC所使用的内存回收算法必须结合年轻代和老年代各自的特点。
 *      ●年轻代(Young Gen)
 *      年轻代特点:区域相对老年代较小，对象生命周期短、存活率低，回收频繁。
 *      这种情况复制算法的回收整理，速度是最快的。
 *      复制算法的效率只和当前存活对象大小有关，因此很适用于年轻代的回收。
 *      而复制算法内存利用率不高的问题，通过hotspot中的两个survivor的设计得到缓解。
 *      ●老年代(Tenured Gen)
 *      老年代特点:区域较大，对象生命周期长、存活率高，回收不及年轻代频繁。
 *      这种情况存在大量存活率高的对象，复制算法明显变得不合适。
 *      一般是由标记-清除或者是标记-清除与标记-整理的混合实现。
 *              ●MIrk阶段的开销与存活对象的数量成正比。
 *              ●Sweep阶段的开销与所管理区域的大小成正相关。
 *              ●Compact阶段的开销与存活对象的数据成正比。
 *   以Hotspot中的CMS回收器为例，CMS 是基于Mark-Sweep实现的，对于对象的回收效率很高。
 *   而对于碎片问题，CMS采用基于Mark-Compact算法的Serial old回收器作为补偿措施:
 *   当内存回收不住(碎片导致的Concurrent Mode Failure时) ，
 *   将采用serial Old执行Full GC以达到对老年代内存的整理。
 *
 *    分代的思想被现有的虚拟机广泛使用。几乎所有的垃圾回收器都区分新生代和老年代。
 *
 *  5.增量收集
 *  算法上述现有的算法，在垃圾回收过程中，应用软件将处于一种stop the World的状态。
 *  在stop the World状态下，应用程序所有的线程都会挂起，暂停一切正常的工作， 等待垃圾回收的完成。
 *  如果垃圾回收时间过长，应用程序会被挂起很久，将严重影响用户体验或者系统的稳定性。
 *  为了解决这个问题，即对实时垃圾收集算法的研究直接导致了增量收集( Incremental Collecting) 算法的诞生。
 *
 *  基本思想
 *  如果一次性将所有的垃圾进行处理，需要造成系统长时间的停顿，
 *  那么就可以让垃圾收集线程和应用程序线程交替执行。
 *  每次，垃圾收集线程只收集一小片区域的内存空间，接着切换到应用程序线程。
 *  依次反复，直到垃圾收集完成。
 *  总的来说，增量收集算法的基础仍是传统的标记-清除和复制算法。
 *  增量收集算法通过对线程间冲突的妥善处理，允许垃圾收集线程以分阶段的方式完成标记、清理或复制工作。
 *
 *  缺点:
 *    使用这种方式，由于在垃圾回收过程中，间断性地还执行了应用程序代码，所以能减少系统的停顿时间
 *    但是，因为线程切换和上下文转换的消耗，会使得垃圾回收的总体成本上升，造成系统吞吐量的下降
 *  6.分区算法國
 *  每一个小区间都独立使用，独立回收。这种算法的好处是可以控制一次回收多少个小区间。
 *  一般来说，在相同条件下，堆空间越大，一次GC时所需要的时间就越长，有关GC产生的停顿也越长。
 *  为了更好地控制GC产生的停顿时间，将一块大的内存区域分割成多个小块，
 *  根据目标的停顿时间，每次合理地回收若干个小区间，而不是整个堆空间，从而减少一次GC所产生的停顿。
 *
 *
 */
public class E_垃圾清除阶段算法 {

}
